﻿// 4225. 石油储备.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>



using namespace std;
/*
https://www.acwing.com/problem/content/4228/

一片土地可以看作是一个 n行 m列的方格矩阵。

其中一些方格藏有石油，用 @ 表示，其余方格没有石油，用 * 表示。

每个方格都与其上、下、左、右、左上、右上、左下、右下八个方格视为相邻。

如果两个藏有石油的方格相邻，则它们被认为是处于同一片油田，否则它们被认为是处于不同油田。

请问，该土地中共有多少片油田。

输入格式
输入包含多组测试数据。

每组数据第一行包含两个整数 n,m。

接下来 n行，包含一个 n行 m列的字符矩阵，表示土地情况。

当输入一行 0 0 时，表示输入结束。

输出格式
每组数据输出一行，一个整数，表示油田数量。

数据范围
最多包含 100组数据。
1≤n,m≤100。

输入样例：
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
输出样例：
0
1
2
2
*/

const int N = 200;
char gra[N][N];
int n, m;

const int addx[] = { 0,0,1,-1,1,-1,1,-1 };
const int addy[] = { 1,-1,0,0,1,-1,-1,1 };

int ans;

void dfs(int x,int y) {
	if (gra[x][y] == '@') gra[x][y] = '*';

	for (int i = 0; i < 8; i++) {
		int newx = x + addx[i];
		int newy = y + addy[i];
		if (newx >= 0 && newx < n && newy >= 0 && newy < m && gra[newx][newy] == '@') {
			dfs(newx, newy);
		}
	}
}

void solve() {
	ans = 0;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (gra[i][j] == '@') {
				ans++;
				dfs(i,j);
			}
		}
	}

	cout << ans << endl;
}

int main()
{
	while (cin >> n >> m) {
		if (0 == n && 0 == m) break;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cin >> gra[i][j];
			}
		}
		solve();
	}


	return 0;
}

 